package br.com.esporte.view.site.component.votacao;

import java.util.Date;
import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.Model;

import br.com.esporte.business.impl.converter.DateConverter;
import br.com.esporte.business.impl.util.DataGeneric;
import br.com.esporte.model.DiaPraticadoGrupo;
import br.com.esporte.model.TipoVotacaoEnum;
import br.com.esporte.model.Usuario;
import br.com.esporte.view.infra.component.ComponenteGenerico;
import br.com.esporte.view.infra.html.HtmlParam;
import br.com.esporte.view.site.component.image.ImageRelativePath;
import br.com.esporte.view.site.template.util.ConstantsTemplate;

/**
 * 
 * @author Milton Domingues
 *
 */
public class VotacaoComponent extends ComponenteGenerico {

	private static final long serialVersionUID = 7992110090386511512L;

	private static final String DATA_ID = "data";
	private static final String STATUS_VOTACAO_ID = "votadoStatus";
	private static final String FORM_ID = "form";
	private static final String USUARIOS_VOTACAO_ID = "usuarioVotacao";
	private static final String IMG_VOTADO_ID = "imgVotado";
	private static final String TIPO_VOTACAO_ID = "tipoVotacao";
	private static final String LINK_VOTACAO_ID = "linkVotar";
	private static final String PIOR_CSS = "imgDiaPraticado bg-diaPraticado bg-diaPraticado-pior";
	private static final String MELHOR_CSS = "imgDiaPraticado bg-diaPraticado bg-diaPraticado-melhor";

	private List<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> usuarios;
	private DiaPraticadoGrupo dia;
	private IPaginaAcaoVotacao pagina;
	private TipoVotacaoEnum tipo;
	private boolean habilitarVotacao;

	public VotacaoComponent(String id, TipoVotacaoEnum tipo, List<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> usuarios, DiaPraticadoGrupo dia, boolean habilitarVotacao, IPaginaAcaoVotacao pagina) {
		super(id);
		setHabilitarVotacao(habilitarVotacao);
		setTipo(tipo);
		setPagina(pagina);
		setUsuarios(usuarios);
		setDia(dia);
		montarComponente();
	}

	private Label criarData(Date data){
		Label dataLabel = new Label(DATA_ID, DateConverter.converterDataHoraToString(data));
		return dataLabel;
	}

	private Link<Usuario> criarLinkVotacao(Usuario usuario, boolean visible){
		Link<Usuario> link = new Link<Usuario>(LINK_VOTACAO_ID, new Model<Usuario>(usuario)) {

			private static final long serialVersionUID = 933930456805862960L;

			@Override
			public void onClick() {
				Usuario usuario = getModelObject();
				pagina.acaoVotar(usuario, getTipo());
			}
		};
		link.setVisible(visible);
		return link;
	}

	private Label criarTipoVotacao(TipoVotacaoEnum tipo){
		Label label = new Label(TIPO_VOTACAO_ID, tipo.getDescricao());
		return label;
	}

	private ListView<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> criarVotados(List<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> usuarios){
		ListView<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> usuariosList = new ListView<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>>(USUARIOS_VOTACAO_ID, usuarios) {

			private static final long serialVersionUID = 1862863161879920289L;

			@Override
			protected void populateItem(ListItem<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> item) {
				DataGeneric<Usuario, DataGeneric<Integer, Boolean>> usuario = item.getModelObject();

				String path = ConstantsTemplate.getPathImageUsuario(usuario.getObject1().getImagem());
				item.add(new ImageRelativePath(IMG_VOTADO_ID, path));

				String status = getStatusVotacaoUsuarioDiaPraticado(usuario);
				item.add(new Label(STATUS_VOTACAO_ID, status));
				item.add(criarLinkVotacao(usuario.getObject1(), isHabilitarVotacao()));
				if(usuario.getObject2().getObject2()){
					String css = (getTipo().equals(TipoVotacaoEnum.MELHOR_JOGADOR) ? MELHOR_CSS : PIOR_CSS);
					item.add(new SimpleAttributeModifier(HtmlParam.CLASS, css));
				}
			}
		};
		return usuariosList;
	}

	public DiaPraticadoGrupo getDia() {
		return dia;
	}

	public IPaginaAcaoVotacao getPagina() {
		return pagina;
	}

	private String getStatusVotacaoUsuarioDiaPraticado(DataGeneric<Usuario, DataGeneric<Integer, Boolean>> usuario){
		StringBuilder label = new StringBuilder();
		label.append(usuario.getObject1().getNome());
		label.append(" - ");
		label.append(usuario.getObject2().getObject1());
		return label.toString();
	}

	public TipoVotacaoEnum getTipo() {
		return tipo;
	}

	public List<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> getUsuarios() {
		return usuarios;
	}

	public boolean isHabilitarVotacao() {
		return habilitarVotacao;
	}

	@Override
	public void montarComponente() {
		Form<Component> form = new Form<Component>(FORM_ID);
		form.add(criarData(getDia().getDataHoraInicio()));
		form.add(criarTipoVotacao(getTipo()));
		form.add(criarVotados(getUsuarios()));
		add(form);
	}

	public void setDia(DiaPraticadoGrupo dia) {
		this.dia = dia;
	}

	public void setHabilitarVotacao(boolean habilitarVotacao) {
		this.habilitarVotacao = habilitarVotacao;
	}

	public void setPagina(IPaginaAcaoVotacao pagina) {
		this.pagina = pagina;
	}

	public void setTipo(TipoVotacaoEnum tipo) {
		this.tipo = tipo;
	}

	public void setUsuarios(List<DataGeneric<Usuario, DataGeneric<Integer, Boolean>>> usuarios) {
		this.usuarios = usuarios;
	}

}
